Acceptance Test

@Wonyu· March 14, 2025 · 5 min read

✅ 사용자 스토리(시나리오)에 맞춰 수행하는 테스트
✅ 개발자와 이해관계자들 간의 토의를 통해 만들어진 시나리오에 기반해 테스트
✅ 실제 HTTP 요청을 보내고 응답을 확인하는 최상위 레벨의 테스트

📌 특징

사용자 관점에서 동작 검증

  • 단순한 코드 실행이 아니라, 실제 사용자의 시나리오를 검증함.
  • 예: "사용자가 회원 가입을 하면, 로그인할 수 있어야 한다."

전체 시스템을 테스트 (E2E 포함)

  • REST API, 데이터베이스, 보안 설정 등 전체 애플리케이션의 동작을 포함한 검증
  • 단순한 API 응답뿐만 아니라, 비즈니스 로직, DB 반영 여부까지 확인 가능

REST API 기반의 테스트가 일반적

  • RestAssured를 사용하여 HTTP 요청-응답을 기반으로 검증
  • Spring Boot에서는 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)를 사용하여 서버를 띄워 테스트

📌 REST-assured

REST API를 테스트하기 위한 Java 기반의 라이브러리
HTTP 요청을 보내고, 응답을 검증하는 기능을 제공
Spring Boot, JUnit과 함께 API 테스트를 수행할 때 많이 사용됨

REST Assured는 2.0 버전 이후로 BDD 스타일(Given-When-Then)을 기반으로 API 테스트를 작성하도록 설계되었다.

Given(설정-요청 준비)

기능 설명 예제
baseUri() 기본 URL 설정 given().baseUri("http://localhost:8080")
basePath() 기본 경로 설정 given().basePath("/users")
port() 포트 설정 given().port(8080)
header() 요청 헤더 설정 given().header("Authorization", "Bearer token")
contentType() 요청 데이터 타입 설정 given().contentType("application/json")
body() 요청 본문 (JSON, XML 등) 설정 given().body("{ \"name\": \"Alice\" }")
pathParam() 경로 변수 설정 given().pathParam("id", 1)
queryParam() 쿼리 파라미터 설정 given().queryParam("sort", "name")
  • API 요청을 보낼 때 필요한 정보(헤더, 파라미터, 본문 등)을 설정한다.

🔹 Default Values
REST-assured는 기본적으로 host를 localhost, port를 8080으로 지정하지만, 메서드나 설정 파일을 통해 값을 변경할 수 있다.

메서드

given().port(80). ..

설정 파일

RestAssured.baseURI = "http://myhost.org";

When(행위-요청 실행)

기능 설명 예제
get() GET 요청 전송 when().get("/users/{id}")
post() POST 요청 전송 when().post("/users")
put() PUT 요청 전송 when().put("/users/{id}")
delete() DELETE 요청 전송 when().delete("/users/{id}")
patch() PATCH 요청 전송 when().patch("/users/{id}")
  • 설정된 요청을 실행해 실제 HTTP 요청을 보낸다.

Then(검증-응답 확인)

기능 설명 예제
statusCode() HTTP 상태 코드 검증 then().statusCode(200)
body() 응답 본문(JSON, XML 등) 값 검증 then().body("name", equalTo("Alice"))
header() 응답 헤더 값 검증 then().header("Content-Type", "application/json")
time() 응답 시간 검증 then().time(lessThan(2000L))
extract() 응답 값 추출 then().extract().jsonPath().getString("token")
  • 응답이 예상한 값과 일치하는지 검증한다.

🔹 ExtractableResponse
extract() 메서드를 통해 응답 정보를 담은 객체를 반환받아 AssertJ로 테스트할 수 있다.

protected void 회원가입_검증(ExtractableResponse response) {  
    int code = response.statusCode();  
    assertThat(code).isEqualTo(HttpStatus.CREATED.value());  
}

vs MockMVC

✅ REST Assured와 MockMvc는 둘 다 API 테스트를 수행할 수 있지만, 사용하는 환경이 다름
MockMvc는 실제 HTTP 요청을 보내지 않고, Controller 계층을 Mock으로 테스트하는 반면, RestAssured는 실제 서버에서 테스트를 수행

테스트 방식 설명 실제 네트워크 요청 Spring 컨텍스트 필요 여부
MockMvc Controller 계층만 테스트
Rest Assured 전체 애플리케이션을 실행하고 API 테스트 수행

📌 참고

https://tecoble.techcourse.co.kr/post/2021-05-25-unit-test-vs-integration-test-vs-acceptance-test/
https://github.com/rest-assured/rest-assured/wiki/Usage
https://www.baeldung.com/rest-assured-tutorial

@Wonyu
Hello :) I'm Wonyu